package com.superhero.website.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.paths.RelativePathProvider;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.servlet.ServletContext;



@Configuration
@EnableSwagger2
public class SwaggerConfig {

    /**
     * 不用管参数报错，和autowired检查有关，不影响编译运行
     *
     * @param servletContext
     * @return
     */
    @Bean
    public Docket docket(ServletContext servletContext) {
        // 定义 Swagger 2.0 规范
        ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2)
                // 定义全局描述信息
                .apiInfo(apiInfo())
                // 定义 API 基础域名
                .host("healthqrcode.info")
                // 定义 API 基础路径前缀，与 host 配合组成 healthqrcode.info/api/v1/backgroud
                .pathProvider(new RelativePathProvider(servletContext) {
                    @Override
                    public String getApplicationBasePath() {
                        return "/api/v1/backgroud";
                    }
                })
                .select();

        // 指定只扫描 @RestController 注解的 Controller 的 API
        builder.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class));

        return builder.build()
                // 排除扫描 @RequestAttribute 注解
                .ignoredParameterTypes(RequestAttribute.class)
                // 排除扫描 @Errors 注解
                .ignoredParameterTypes(Errors.class);
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // 定义文档标题
                .title("防疫健康码小程序-后台管理系统 API 文档")
                // 定义文档描述
                .description("这是一篇关于防疫健康码小程序-后台管理系统的 API 文档，仅做参考。")
                // 定义服务条款
                .termsOfServiceUrl("http://swagger.io/terms/")
                // 定义联系信息
                .contact(new Contact("CODING", "https://coding.net", "support@coding.net"))
                // 定义 License
                .license("Apache 2.0")
                // 定义 License URL
                .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
                // 定义 API 版本
                .version("1.0.0")
                .build();
    }

}
